/*
 * ----------------------------------------------------------------
 *  FECHA      HORA     NOMBRE       COMENTARIO
 * ----------------------------------------------------------------
 *  14/05/08   19:25    ALEX         Creación de implementació
 *  15/05/08   22:47    ALEX         Modificación en la estructura de
 *                                   métodos y atributos
 *  17/05/08   19:25    ALEX         Implementación de la clase 
 *
 * 
 */

package net.ieslaferreria.infoCiutat;

import java.util.Calendar;
import java.util.Date;
import java.util.Vector;

/**
 *
 * @author Alex, Javi, David y Sergio
 */
public class ParametresCercaImpl implements ParametresCerca{

    /*
     * Variable que conté la hora (en minuts des de la mitja nit) 
     * a la que volem iniciar la ruta.
     */
    private int horaInici = 0;
    
    /*
     * Variable que conté la hora (en minuts des de la mitja nit) 
     * màxima a la que volem finalitzar la ruta.
     */
    private int horaFinal = 1440;
    
    /*
     * Variable que conté el dia que volem inicia la ruta.
     */
    private Date data;
    
    /*
     * Variable que diu si volem una ruta que impliqui esforç físic.
     */
    private Boolean esforcFisic = Boolean.TRUE;
    
    /*
     * Variable que diu si volem una ruta que impliqui medis subterranis.
     */
    private Boolean subterrani = Boolean.TRUE;
    
    /*
     * Variable on es guarden les xarxes per on no pot passar la ruta.
     */
    private Vector xarxesProhibides = null;
    
    /*
     * Velocitat màxima a la que serà possible mourens per la ruta depenent de
     * les xarxes que no estan prohibides.
     */
    private int velocitatMaxima = 0;
    
    /*
     * Punt des d'on s'ha d'iniciar la ruta.
     */
    private Punt puntOrigen;
    
    /*
     * Punt a on ha d'acabar la ruta
     */
    private Punt puntDesti;
    
    /*
     * Indica si les xarxes prohibides estan comprovades.
     */
    private Boolean xarxesComprovades = Boolean.FALSE;
    
    /*
     * Indica si la velocitat màxima s'ha comprovada.
     */
    private Boolean velocitatComprovada = Boolean.FALSE;
    
    public ParametresCercaImpl (Punt puntOrigen, Punt puntDesti, Date data,
				int horaInici, int horaFinal){
    }
	
    public ParametresCercaImpl (Punt puntOrigen, Punt puntDesti, int horaInici,
                                int horaFinal, Boolean esforcFisic, 
                                Boolean subterrani, Date data){
    }
    
    public void setHoraInici(int horaInici) {
        this.horaInici = horaInici;
        this.xarxesComprovades = Boolean.FALSE;
    }

    public void setHoraFinal(int horaFinal) {
        this.horaFinal = horaFinal;
        this.xarxesComprovades = Boolean.FALSE;
    }

    public void setData(Date data) {
        this.data = data;
        this.xarxesComprovades = Boolean.FALSE;
    }

    public void setEsforcFisic(Boolean esforcFisic) {
        this.esforcFisic = esforcFisic;
        this.xarxesComprovades = Boolean.FALSE;
    }

    public void setSubterrani(Boolean subterrani) {
        this.subterrani = subterrani;
        this.xarxesComprovades = Boolean.FALSE;
    }

    public int getHoraInici() {
        return this.horaInici;
    }

    public int getHoraFinal() {
        return this.horaFinal;
    }

    public Date getData() {
        return this.data;
    }

    public Boolean getEsforcFisic() {
        return this.esforcFisic;
    }

    public Boolean getSubterrani() {
        return this.subterrani;
    }

    public void setPuntInici(Punt puntInici) {
        this.puntOrigen = puntInici;
    }

    public void setPuntFinal(Punt puntFinal) {
        this.puntDesti = puntFinal;
    }

    public Punt getPuntInici() {
        return this.puntOrigen;
    }

    public Punt getPuntFinal() {
        return this.puntDesti;
    }

    public void addXarxaProhibida(int codiXarxa) {
        this.xarxesProhibides.addElement(String.valueOf(codiXarxa));
		this.velocitatComprovada = Boolean.FALSE;
    }

    public void delXarxaProhibida(int codiXarxa) {
        this.xarxesProhibides.removeElement(String.valueOf(codiXarxa));
		this.velocitatComprovada = Boolean.FALSE;
    }

    public Vector getXarxesProhibides() {
		if (!this.xarxesComprovades.booleanValue()){
			comprovaXarxesProhibides();
		}
        return this.xarxesProhibides;
    }
    
    public int getVelocitatMaxima() {
        if (!this.velocitatComprovada.booleanValue()){
            comprovaVelocitatMaxima();
        }
        return this.velocitatMaxima;
    }
    
    /**
     * Busca quina serà la velocitat màxima de la ruta entre totes les xarxes
     * que participarán a la cerca. Ho guardará a l'atribut velocitatMaxima.
     */
    private void comprovaVelocitatMaxima() {
        int ind = 0;
	int ind2 = 0;
        int codi = 0;
	XarxaManager xarxes = new XarxaManagerImpl(InfoCiutat.db);
        Vector llistaXarxes = xarxes.getLlistaXarxesVelocitat();
            if (this.xarxesProhibides != null){
            do {codi = Integer.parseInt(String.valueOf(llistaXarxes.elementAt(ind)));
                ind2 = 0;
                while (this.xarxesProhibides.size() < ind2 || codi != Integer.
                       parseInt(String.valueOf(this.xarxesProhibides.elementAt(ind2)))){
                    ind2++;
                    }
                if (this.velocitatMaxima < xarxes.getXarxa(codi).getVelocitat()){
                    this.velocitatMaxima = xarxes.getXarxa(codi).getVelocitat();
                }
                ind++;
            } while (ind < llistaXarxes.size());
            } else {
                codi = Integer.parseInt(String.valueOf(llistaXarxes.firstElement()));
                this.velocitatMaxima = xarxes.getXarxa(codi).getVelocitat();
            }
        this.velocitatComprovada = Boolean.TRUE;
    }
    
    /**
     * Retorna el numero del dia de la setmana en que es vol fer la cerca.
     * 
     * @return int
     */
    private int getDiaSetmana() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(this.data);
        return cal.DAY_OF_WEEK;
    }
    
    /**
     * Comprova entre totes les restriccion quines xarxes no han de participar
     * en la ruta. Ho guarda a l'atribut xarxesComprovades.
     */
    private void comprovaXarxesProhibides() {
        XarxaManager xarxes = new XarxaManagerImpl(InfoCiutat.db);
        Vector llistaXarxes = xarxes.getLlistaXarxes();
        int ind = 0;
        Xarxa xarxa = new XarxaImpl();
        while (ind<llistaXarxes.size()) {
            xarxa = xarxes.getXarxa(ind);
            if (xarxa.esSubterrani() != this.subterrani.
                booleanValue() ||  xarxa.hiHaEsforçFisic() != 
                this.esforcFisic.booleanValue() || xarxa.
                getHoraInici(this.getDiaSetmana()) >= this.horaInici ||
                xarxa.getHoraFi(this.getDiaSetmana()) <= this.horaFinal){
                this.addXarxaProhibida(ind);
                ind++;
            }
        }
		this.xarxesComprovades = Boolean.TRUE;
    }
    
}
